package hojano6;
/**
 *
 * @author Andrea Magaly Mendoza, carne 11331
 */
public interface BinaryTree <E extends Comparable<E>> {
    
    
    /**
     * Obtienen el subarbol derecho del nodo.
     * @pre: -
     * @post: Regresa la referencia de un (posible vacio) subÃ¡rbol
     * derecho.
     */
    public BinaryTree<E> right ();
    
    /**
     * Obtiene el subarbol izquierdo del nodo.
     * @pre: -
     * @post: Regresa la referencia de un (posible vacio) subÃ¡rbol
     * izquierdo.
     */
    public BinaryTree<E> left ();
            
    /**
     * Obtiene la referencia del padre del nodo.
     * @pre: -
     * @post: Regresa la referencia a un nodo padre o un nulo.
     */
    public BinaryTree<E> parent ();
    
    /**
     * Actualiza el subÃ¡rbol derecho del nodo.
     * @pre: -
     * @post: Coloca un subarbol derecho.
     * @param newRight 
     */
    public void setRight (BinaryTree<E> newRight);
    
    /**
     * Actualiza el subÃ¡rbol izquierdo del nodo.
     * @pre: -
     * @post: Coloca un subarbol izquierdo.
     * @param newLeft 
     */
    public void setLeft (BinaryTree<E> newLeft);
    
    /**
     * Actualiza el padre del nodo.
     * @pre: -
     * @post: Vuelve a colocar un nuevo padre al nodo con el que se
     * estÃ¡ trabajando.
     * @param newParent 
     */
    public void setParent (BinaryTree<E> newParent);
    
    /**
     * MÃ©todo que genera un in-order iterador de los subÃ¡rboles.
     * @pre: -
     * @post: Regresa un in-order iterador de sus elementos.
     * @return in-order iterator.
     */
    public Iterator<E> iterator();
    
    /**
     * Determina si el nodo es un hijo derecho.
     * @pre: -
     * @post: Retorna verdadero si es un hijo derecho del padre. 
     */
    public boolean isRightChild();
    
    /**
     * Determina si el nodo es un hijo izquierdo.
     * @pre: -
     * @post: Retorna verdadero si es un hijo izquierdo del padre. 
     */
    public boolean isLeftChild();
    
    /**
     * Retorna el valor asociado con el nodo.
     * @pre: -
     * @post: Retorna el valor asociado con el nodo con que se estÃ¡
     * trabajando.
     * @return value
     */
    public E value ();
    
    /**
     * Determina el valor asociado con el nodo.
     * @pre: -
     * @post: Coloca el valor asociado con el nodo.
     * @param value 
     */
    public void setValue (E value);
    
    /**
     * MÃ©todo que permite determinar si el Ã¡rbol estÃ¡ vacio.
     * @pre: -
     * @post: Regresa verdadero si el Ã¡rbol estÃ¡ vacio.
     */
    public boolean isEmpty();
    
    /**
     * Regresa el numero de descendientes del nodo.
     * @pre: -
     * @post: Regresa el tamaÃ±o del subÃ¡rbol.
     * @return size
     */
    public int size();
    
    /**
     * Regresa la referencia de la raiz del Ã¡rbol.
     * @pre: -
     * @post: Regresa la raiz.
     */
     public BinaryTree root(); 
}
